﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EpsiRisk.DonneesPlateau;
using EpsiRisk.AffichageJeu;
using System.Threading;

namespace EpsiRisk.MoteurJeu
{
    public static class ClassPhaseAttaque
    {
        public static int NbAttaquants;

        private static int lastNbDef;

        public static int NbDefenseurs
        {
            get
            {
                if (sousTerritoireDefenseur != null)
                {
                    if (sousTerritoireDefenseur.nbArmees > 1)
                    {
                        lastNbDef = 2;
                        return 2;
                    }
                    else
                    {
                        lastNbDef = 1;
                        return 1;
                    }
                }
                else
                {
                    return lastNbDef;
                }
            }
        }

        public static ClassSousTerritoire sousTerritoireAttaquant
        {
            get { return ClassEtatPartie.sousTerritoireSelectionne; }
            set { ClassEtatPartie.sousTerritoireSelectionne = value; }
        }
        public static ClassSousTerritoire sousTerritoireDefenseur
        {
            get { return ClassEtatPartie.sousTerritoireSelectionneBis; }
            set { ClassEtatPartie.sousTerritoireSelectionneBis = value; }
        }

        public static void initialisePhaseAttaque()
        {
            sousTerritoireDefenseur = null;
            sousTerritoireAttaquant = null;
            NbAttaquants = 1;
            ClassDonneesGlobales.zoneSelectionAttaquant.nbSoldatsDefaut();
        }

        public static void setAttaquant(ClassSousTerritoire sT)
        {
            if (sT != null)
                if (sT.Proprietaire == ClassEtatPartie.joueurCourant())
                    sousTerritoireAttaquant = sT;
        }

        public static void setDefenseur(ClassSousTerritoire sT)
        {
            if (sT != null)
                if (sT.Proprietaire != ClassEtatPartie.joueurCourant())
                    sousTerritoireDefenseur = sT;
        }

        internal static void ClicSousTerritoire(ClassSousTerritoire sT)
        {
            if (sT != null)
            {
                if (sT.Proprietaire == ClassEtatPartie.joueurCourant())
                {
                    if (sT == sousTerritoireAttaquant)
                    {
                        sousTerritoireAttaquant = null;
                    }
                    else
                    {
                        sousTerritoireAttaquant = sT;
                    }
                    sousTerritoireDefenseur = null;
                }
                else
                {
                    if (sousTerritoireAttaquant != null)
                    {
                        if (sT == sousTerritoireDefenseur)
                        {
                            sousTerritoireDefenseur = null;
                        }
                        else
                        {
                            if (sousTerritoireAttaquant.Voisins.Contains(sT))
                            {
                                sousTerritoireDefenseur = sT;
                            }
                            else
                            {
                                ClassDonneesGlobales.zoneOverlayMessage.PopText("Vous devez attaquer un territoire voisin");
                            }
                        }
                    }
                    else
                    {
                        ClassDonneesGlobales.zoneOverlayMessage.PopText("Selectionnez d'abord l'attaquant");
                    }
                }
            }
        }

        public static void attaque()
        {
            if (sousTerritoireAttaquant == null)
            {
                ClassDonneesGlobales.zoneOverlayMessage.PopText("Selectionner l'attaquant!");//TODO message selectionnez territoire attaquant
            }
            else
            {
                if (sousTerritoireDefenseur == null)
                {
                    ClassDonneesGlobales.zoneOverlayMessage.PopText("Selectionner le defenseur!");//TODO message selectionnez territoire a attaquer
                }
                else
                {
                    if (sousTerritoireAttaquant.Voisins.Contains(sousTerritoireDefenseur))
                    {
                        if (sousTerritoireAttaquant.Armee.Count > 1)
                        {
                            //attaque possible, nombre de dés ?
                            ClassDonneesGlobales.zoneContextuelle = ClassDonneesGlobales.zoneLancementDes;
                            ClassDonneesGlobales.des.lancerLesDes();
                            gestion_resultat = new Thread(new ThreadStart(gerer_resultat_attaque));
                            attaque_debutee();
                            gestion_resultat.Start();
                        }
                        else
                        {
                            ClassDonneesGlobales.zoneOverlayMessage.PopText("Attaque impossible : une seule armee");
                        }
                    }
                    else
                    {
                        Console.WriteLine("Impossible d'attaquer un territoire non-frontalier!");
                    }
                }
            }
        }

        public static Thread gestion_resultat;

        public static void gerer_resultat_attaque()
        {
            
            ClassDonneesGlobales.des.deBleu1.finRoulement.WaitOne();
            if (NbDefenseurs == 1)//1 défenseur
            {
                //if (ClassDonneesGlobales.des.deBleu1.valeur < ClassDonneesGlobales.des.deRouge1.valeur || NbAttaquants > 1 && ClassDonneesGlobales.des.deBleu1.valeur < ClassDonneesGlobales.des.deRouge2.valeur || NbAttaquants > 2 && ClassDonneesGlobales.des.deBleu1.valeur < ClassDonneesGlobales.des.deRouge3.valeur)
                if (ClassDonneesGlobales.des.maxBleu(1) < ClassDonneesGlobales.des.maxRouge(NbAttaquants))
                {
                    conquete();
                }
                else
                {
                    pertes(1, 0);
                }

            }
            else//2 dés defenseurs
            {
                if (NbAttaquants == 1)
                {

                    if (ClassDonneesGlobales.des.maxRouge(1) > ClassDonneesGlobales.des.maxBleu(2))
                    {
                        pertes(0, 1);
                    }
                    else
                    {
                        pertes(1, 0);
                    }

                }
                else
                {
                    if (ClassDonneesGlobales.des.maxRouge(NbAttaquants) > ClassDonneesGlobales.des.maxBleu(2))
                    {
                        if (ClassDonneesGlobales.des.secondRouge(NbAttaquants) > ClassDonneesGlobales.des.secondBleu(2))
                        {

                            if (sousTerritoireDefenseur.nbArmees == 2)
                            {
                                conquete();
                            }
                            else
                            {
                                pertes(0, 2);
                            }
                        }
                        else
                        {
                            pertes(1, 1);
                        }
                    }
                    else
                    {
                        if (ClassDonneesGlobales.des.secondRouge(NbAttaquants) > ClassDonneesGlobales.des.secondBleu(2))
                        {
                            pertes(1, 1);
                        }
                        else
                        {
                            pertes(2, 0);
                        }
                    }
                }

            }
            attaque_terminee();
        }

        public static void conquete()
        {
            sousTerritoireDefenseur.Proprietaire = sousTerritoireAttaquant.Proprietaire;
            sousTerritoireDefenseur.Armee.Clear();//vide les soldats du perdants
            sousTerritoireAttaquant.deplacerSoldats(sousTerritoireDefenseur, NbAttaquants);
            ClassDonneesGlobales.zoneOverlayMessage.PopText("Vous avez conquis le " + ClassDonneesGlobales.plateauCourant.AliasSousTerritoire);
            ClassEtatPartie.victoireDefaite();
        }

        public static void pertes(int perteAtk, int perteDef)
        {
            if (perteAtk == 1 && perteDef == 1)
            {
                ClassDonneesGlobales.zoneOverlayMessage.PopText("Chacun perd un soldat");
            }
            else
            {
                string plur;
                if (perteAtk > 0)
                {
                    if (perteAtk > 1) { plur = "s"; } else { plur = ""; };
                    ClassDonneesGlobales.zoneOverlayMessage.PopText("Vous perdez " + perteAtk + " soldat" + plur);
                }
                if (perteDef > 0)
                {
                    if (perteDef > 1) { plur = "s"; } else { plur = ""; };
                    ClassDonneesGlobales.zoneOverlayMessage.PopText("Le defenseur perds " + perteDef + " soldat" + plur);
                }
            }
            for (int i = 0; i < perteAtk; i++)
            {
                sousTerritoireAttaquant.enleverSoldat();
            }
            for (int i = 0; i < perteDef; i++)
            {
                sousTerritoireDefenseur.enleverSoldat();
            }
        }

        public static void attaque_debutee()
        {
            ClassDonneesGlobales.zoneJeu.desactiveClicTerritoire = true;
        }

        public static void attaque_terminee()
        {
            ClassDonneesGlobales.zoneJeu.desactiveClicTerritoire = false;
            ClassPhaseAttaque.sousTerritoireAttaquant = null;
            ClassPhaseAttaque.sousTerritoireDefenseur = null;
        }
    }
}
